let utils = {
    /**
     * 此方法必须要与项目中的utils.scss一起使用
     * e:需要加上涟漪动画的dom
     * rippes_color:涟漪动画的颜色
     * opacity:涟漪动画的透明度
     */
    ripples_animation: (e, rippes_color, opacity) => {
        let scss_css_w =
            e.target.offsetWidth > e.target.offsetHeight
                ? e.target.offsetWidth
                : e.target.offsetHeight;
        document
            .getElementsByClassName("aa")[0]
            .style.setProperty("--utils-ripples-w", scss_css_w * 2 + "px");
        document
            .getElementsByClassName("aa")[0]
            .style.setProperty("--utils-ripples-h", scss_css_w * 2 + "px");
        document
            .getElementsByClassName("aa")[0]
            .style.setProperty("--utils-ripples-color", rippes_color);
        document
            .getElementsByClassName("aa")[0]
            .style.setProperty("--utils-ripples-opacity", opacity);
        let x = e.clientX - e.target.offsetLeft;
        let y = e.clientY - e.target.offsetTop;
        let rippes = document.createElement("span");
        rippes.style.left = x + "px";
        rippes.style.top = y + "px";
        rippes.className = "utils-btn-animation";
        e.target.appendChild(rippes);
        setTimeout(() => {
            rippes.remove();
        }, 500);
    },
    //判断是否canvas是否为空
    is_canvas_blank: (canvas_dom) => {
        var blank = document.createElement("canvas"); //系统获取一个空canvas对象
        blank.width = canvas_dom.width;
        blank.height = canvas_dom.height;
        return canvas_dom.toDataURL() == blank.toDataURL(); //比较值相等则为空
    },
    //节流
    throttle: (fn, dalay) => {
        //声明变量保存第一次点击的时间
        let begin = 0;
        //btn的点击函数，触发的为节流函数的返回函数，所以btn的this也是在改函数中
        return function (...rest) {
            //保存点击的时间
            let date = new Date().getTime();
            //如果当前时间减掉第一次点击的时间大于传过来的时间时
            if (date - begin > dalay) {
                //将函数的指向指向当前函数的this
                fn.apply(this, ...rest);
                begin = date;
            }
        };
    },
    //防抖
    debounce(fn, time) {
        // 声明一个变量,统计延期个数
        let timer;
        return function (...rest) {
            if (timer) clearInterval(timer);
            // N秒后执行的函数
            timer = setTimeout(function handler() {
                fn.apply(this, ...rest);
            }, time);
        };
    },
    /**
     * 格式化时间
     * fmt：格式 YYYY-MM-DD hh:mm:ss
     * date：时间戳
     */
    date_format(fmt, date) {
        const opt = {
            "Y+": date.getFullYear().toString(), // 年
            "M+": (date.getMonth() + 1).toString(), // 月
            "D+": date.getDate().toString(), // 日
            "h+": date.getHours().toString(), // 时
            "m+": date.getMinutes().toString(), // 分
            "s+": date.getSeconds().toString(), // 秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (let k in opt) {
            //检索格式是否含有对应的字符
            let ret = new RegExp("(" + k + ")").exec(fmt);
            if (ret) {
                fmt = fmt.replace(
                    ret[1],
                    ret[1].length == 1
                        ? opt[k]
                        : opt[k].padStart(ret[1].length, "0")
                );
            }
        }
        return fmt;
    },
    //生成一个A-Z的数组
    generate_letter_arr: () => {
        return [...Array(26).keys()].map((i) => String.fromCharCode(i + 65));
    },

    //判断是否为合法电话号码
    is_phone: (phone) => {
        if (phone) {
            let reg =
                /^(0|86|17951)?(13[0-9]|14[759]|15[012356789]|16[6]|17[01235678]|18[0-9]|19[89])[0-9]{8}$/;
            return reg.test(phone);
        } else {
            return false;
        }
    },
    //生成多少范围之间的随机数
    randomNum: (minNum, maxNum) => {
        return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
    },
    //判断是否为整数
    is_num: (number) => {
        return number % 1 === 0;
    },
    // 转义
    urlEscape(url) {
        return url.replace(/&(lt|gt|amp|quot);/g, function (c) {
            return {
                "&lt;": "<",
                "&gt;": ">",
                "&amp;": "&",
                "&quot;": '"',
            }[c];
        });
    },

    /**
     * @class 监听虚拟键盘
     * @classdesc 监听虚拟键盘弹出隐藏
     * @public onEnd 结束监听虚拟键盘
     * @public onShow 传递一个回调 监听虚拟键盘弹出
     * @public onHidden 传递一个回调 监听虚拟键盘隐藏
     */
    Monitorkey: class MonitorKeyboard {
        constructor() {
            this.type = this.IsIA();
            this.originalHeight = window.innerHeight;
        }
        /**
         *  @function IsIA 获取设备类型
         *  @param  1 Android 2 iOS
         */
        IsIA = () => {
            const userAgent =
                typeof window === "object" ? window.navigator.userAgent : "";
            if (/android/i.test(userAgent)) {
                return 1;
            } else if (/iPhone|iPod|iPad/i.test(userAgent)) {
                return 2;
            }
        };

        // Android系统
        onResize = () => {
            //键盘弹起与隐藏都会引起窗口的高度发生变化
            const resizeHeight = window.innerHeight;
            if (this.originalHeight - resizeHeight > 50) {
                this.show(this.originalHeight - document.documentElement.clientHeight);
            } else {
                this.hidden(this.originalHeight - document.documentElement.clientHeight);
            }
        };

        // iOS获取焦点
        onFocusin = () => {
            this.show();
        };

        // iOS失去焦点
        onFocusout = () => {
            this.hidden(this.originalHeight - document.documentElement.clientHeight);
        };

        /**
         * @function onStart 开始监听虚拟键盘
         */
        onStart = () => {
            if (this.type == 1) {
                // 获取窗口的高度
                window.addEventListener("resize", this.onResize);
            }
            if (this.type == 2) {
                // iOS系统
                window.addEventListener("focusin", this.onFocusin);
                window.addEventListener("focusout", this.onFocusout);
            }
        };

        /**
         * @function onEnd 结束监听虚拟键盘
         */
        onEnd = () => {
            if (this.type == 1) {
                //获取窗口的高度
                window.removeEventListener("resize", this.onResize);
            }
            if (this.type == 2) {
                window.removeEventListener("focusin", this.onFocusin);
                window.removeEventListener("focusout", this.onFocusout);
            }
        };

        /**
         * @function  onShow 传递一个回调函数
         * @param  虚拟键盘弹出时触发
         */
        onShow = (fn) => {
            this.show = fn;
        };

        /**
         * @function  onHidden 传递一个回调函数
         * @param  虚拟键盘隐藏时触发
         */
        onHidden = (fn) => {
            this.hidden = fn;
        };
    },
};

export default utils;
